package model.util;


/**
 * 페이징 처리를 위한 클래스
 * @author Yeongseok
 *
 */
public class PagingBean {
	/**
	 * 현제 페이지
	 */
	private int nowPage;
	/**
	 * 페이지 당 보여질 게시물 수
	 */
	private int numberOfContentsPerPage = CommonConstants.CONTENT_NUMBER_PER_PAGE;
	/**
	 * 한페이지당 보여질 페이지 그룹의 페이지 수
	 * 
	 * 게시물
	 * 게시물
	 * 게시물
	 * 게시물
	 * 게시물
	 * 
	 * 1 2 3 4 화살표
	 */
	private int numberOfPageGroup = CommonConstants.PAGEGROUP_NUMBER_PER_PAGE;
	/**
	 * 현재 db에 저장된 총 게시물 수
	 */
	private int totalContent;
	
	/**
	 * db로 부터 전체 게시물 수, 현재 페이지는 web으로부터 받아 생성
	 * @param totalContent
	 * @param nowPage
	 */
	public PagingBean(int totalContent, int nowPage){
		this.totalContent = totalContent;
		this.nowPage = nowPage;
	}
	/**총 페이지 수를 return한다.
	 1. 전체 데이터(게시물) % 한 페이지에 보여줄 데이터 개수 => 0 이면 둘을 / 값이 총 페이지 수
	 2. 전체 데이터(게시물) % 한 페이지에 보여줄 데이터 개수 => 0보다 크면 둘을 / 값에 +1을 한 값이 총 페이지 수
	 게시물수 1 2 3 4 5 6 7 8 9 10 11
	 1페이지 1~5
	 2페이지 6~10
	 3페이지 11
	 */
	 public int getTotalPage(){
		 int num = this.totalContent%this.numberOfContentsPerPage;
		 int totalPage = 0;
		 if(num==0){
			 totalPage=this.totalContent/this.numberOfContentsPerPage;
		 }else{
			 totalPage=this.totalContent/this.numberOfContentsPerPage+1;
		 }
	  return totalPage;
	 }
	 /**
	  * 총 페이지 그룹의 수를 return한다.
		1. 총 페이지수 % Page Group 내 Page 수. => 0 이면 둘을 / 값이 총 페이지 수
		2. 총 페이지수 % Page Group 내 Page 수. => 0보다 크면 둘을 / 값에 +1을 한 값이 총 페이지 수
		ex)총 게시물 수 23개
			총 페이지 ? 총 페이지 그룹 수 ?
			페이지 1 2 3 4 5
			페이지그룹 1234(1그룹) 5(2그룹)
	  * @return
	  */
	public int getTotalPageGroup(){
		int num = this.getTotalPage() % this.numberOfPageGroup;
		int totalPageGroup=0;
		if(num==0){
			totalPageGroup = this.getTotalPage() / this.numberOfPageGroup;
		}else{
			totalPageGroup = this.getTotalPage() / this.numberOfPageGroup + 1;
		}
		return totalPageGroup;
	}
	/**
	 * 현재 페이지가 속한 페이지 그룹 번호(몇 번째 페이지 그룹인지) 을 return 하는 메소드 
	 * 1. 현재 페이지 % Page Group 내 Page 수 => 0 이면 둘을 / 값이 현재 페이지 그룹. 
	 * 2. 현재 페이지 % Page Group 내 Page 수 => 0 크면 둘을 / 값에 +1을 한 값이 현재 페이지 그룹
	 * @return
	 */
	public int getNowPageGroup(){
		int num = this.nowPage % this.numberOfPageGroup;
		int nowPageGroup=0;
		if(num==0){
			nowPageGroup = this.nowPage / this.numberOfPageGroup;
		}else{
			nowPageGroup = this.nowPage / this.numberOfPageGroup+1;
		}
		return nowPageGroup;
	}
	/**
	 * 현재 페이지가 속한 페이지 그룹의 시작 페이지 번호를 return 한다.
		1. Page Group 내 Page 수*(현재 페이지 그룹 -1) + 1을 한 값이 첫 페이지이다.
		(페이지 그룹*페이지 그룹 개수 이 그 그룹의 마지막 번호이므로)
		2. 위의 계산 결과가 0인 경우는 첫페이지 이므로 1을 return 한다.
		페이지 그룹
		1 2 3 4 -> 5 6 7 8 -> 9 10
	 * @return
	 */
	public int getStartPageOfPageGroup(){
		int num = this.numberOfPageGroup * (this.getNowPageGroup()-1)+1;
		int startPageOfPageGroup;
		if(num==0){
			startPageOfPageGroup = 1;
		}else{
			startPageOfPageGroup = num;
		}
		return startPageOfPageGroup;
	}
	/**
	 * 현재 페이지가 속한 페이지 그룹의 마지막 페이지 번호를 return 한다.
		1. 현재 페이지 그룹 * 페이지 그룹 개수 가 마지막 번호이다. 
		2. 그 그룹의 마지막 페이지 번호가 전체 페이지의 마지막 페이지 번호보다 
		큰 경우는 전체 페이지의 마지막 번호를 return 한다.
		1 2 3 4 -> 5 6 7 8  -> 9 10
	 * @return
	 */
	public int getEndPageOfPageGroup(){
		int num = this.getNowPageGroup() * this.numberOfPageGroup;
		int endPageOfPageGroup=0;
		if(num>this.getTotalPage()){
			endPageOfPageGroup = this.getTotalPage();
		}else{
			endPageOfPageGroup = num;
		}
		return endPageOfPageGroup;
	}
	/**
	 * 이전 페이지 그룹이 있는지 체크
	 *  현재 페이지가 속한 페이지 그룹이 1보다 크면 true
	 * ex) 페이지
	 * 		1 2 3 4 / 5 6 7 8 / 9 10
	 *          1        2       3  group
	 * @return
	 */
	public boolean isPreviousPageGroup(){
		boolean flag = false;
		if(this.getNowPageGroup()>1){
			flag=true;
		}
		return flag;
	}
	/**
	 * 다음 페이지 그룹이 있는지 체크
	 * 현재 페이지 그룹이 마지막 페이지 그룹
	 * (마지막 페이지 그룹 == 총 페이지 그룹 수) 보다 작으면 true
	 * @return
	 */
	public boolean isNextPageGroup(){
		boolean flag = false;
		if(this.getNowPageGroup()<this.getTotalPageGroup()){
			flag=true;
		}
		return flag;	
	}
	
	public static void main(String agrs[]){
		PagingBean bean = new PagingBean(32, 1);
		System.out.println("전체 페이지:"+bean.getTotalPage());
		System.out.println("전체 페이지 그룹:"+bean.getTotalPageGroup());
		System.out.println("현재 페이지 그룹:"+bean.getNowPageGroup());
		System.out.println("페이지 그룹 시작 페이지:"+bean.getStartPageOfPageGroup());
		System.out.println("페이지 그룹 마지막 페이지:"+bean.getEndPageOfPageGroup());
		System.out.println("이전 그룹 페이지:"+bean.isPreviousPageGroup());
		System.out.println("다음 그룹 페이지:"+bean.isNextPageGroup());
	}
}
